// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境

// 获取openid
const getOpenId = async () => {
  // 获取基础信息
  const wxContext = cloud.getWXContext();
  return {
    openid: wxContext.OPENID,
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID,
  };
};

// 保存个人信息
const saveUserInfo = async (event) => {
  const db = cloud.database()

  // 获取调用云函数的用户上下文，其中包括 openid, appid
  const wxContext = cloud.getWXContext()
  const openid = wxContext.OPENID // 用户的 OpenID，在此安全获取
  const { avatarUrl, nickName, weekTarget } = event // 从前端传递过来的数据

  // 检查用户是否已存在
  const userQuery = await db.collection('users').where({
    openid: openid
  }).get()

  // 用户信息数据
  const userData = {
    avatar: avatarUrl,
    nickname: nickName,
    weekTarget: weekTarget,
    // 可以添加其他字段，如更新时间
    "updated_at": db.serverDate()
  }

  if (userQuery.data.length > 0) {
    // 如果用户已存在，则更新记录
    await db.collection('users').doc(userQuery.data[0]._id).update({
      data: userData
    })
    return {
      success: true,
      message: '用户信息更新成功',
      openid: openid
    }
  } else {
    // 如果用户不存在，则新增记录
    // 可以添加首次创建的时间
    userData["created_at"] = db.serverDate()
    userData.currentwordbook = ''
    userData.openid = openid
    await db.collection('users').add({
      data: userData
    })
    return {
      success: true,
      message: '用户信息创建成功',
      openid: openid
    }
  }
};

// 保存用户选择的词库
const saveUserWordBook = async (event) => {
  const db = cloud.database()
  const wxContext = cloud.getWXContext()
  const openid = wxContext.OPENID // 用户的 OpenID，在此安全获取
  const { wordBookName } = event
  // 检查用户是否已存在
  const userQuery = await db.collection('users').where({
    openid: openid
  }).get()

  if (userQuery.data.length > 0) {
    // 如果用户已存在，则更新记录
    await db.collection('users').doc(userQuery.data[0]._id).update({
      data: {
        currentwordbook: wordBookName
      }
    })
    return {
      success: true,
      message: '用户信息更新成功',
      openid: openid
    }
  } else {
    return {
      success: false,
      message: '用户信息不存在',
      code: 'USER_NOT_FOUND'
    }
  }
};

// 获取用户信息
const getUserInfo = async () => {
  const db = cloud.database()
  
  // 获取当前用户的 openid
  const wxContext = cloud.getWXContext()
  const openid = wxContext.OPENID
  
  try {
    // 查询数据库，获取用户信息
    const result = await db.collection('users')
      .where({
        openid: openid
      })
      .get()
    
    // 检查是否找到用户记录
    if (result.data.length === 0) {
      return {
        success: false,
        message: '用户信息不存在',
        code: 'USER_NOT_FOUND'
      }
    }
    
    // 提取用户信息
    const userInfo = result.data[0]
    
    return {
      success: true,
      data: {
        avatar: userInfo.avatar,
        nickname: userInfo.nickname,
        weekTarget: userInfo.weekTarget,
        currentwordbook: userInfo.currentwordbook
      }
    }
  } catch (error) {
    console.error('获取用户信息失败:', error)
    return {
      success: false,
      message: '获取用户信息失败',
      error: error.message,
      code: 'DB_QUERY_ERROR'
    }
  }
};

// 获取本周用户的学习单词数量
const getCurWeekStudyCount = async () => {
  const db = cloud.database()
  
  // 获取当前用户的 openid
  const wxContext = cloud.getWXContext()
  const openid = wxContext.OPENID

  // 计算本周的开始日期和结束日期
  const today = new Date();
  const dayOfWeek = today.getDay(); // 周日是0，周六是6
  const startOfWeek = new Date(today);
  startOfWeek.setDate(today.getDate() - dayOfWeek);
  const endOfWeek = new Date(today);
  endOfWeek.setDate(today.getDate() + (6 - dayOfWeek));

  try {
    // 构建查询条件并执行查询
    const result = await db.collection('user_memory')
      .where({
        user_id: openid,
        added_at: db.command.and(db.command.gte(startOfWeek), db.command.lte(endOfWeek)),
        status: '已掌握'
      })
      .count();

    // 返回结果
    return {
      success: true,
      count: result.total
    };
  } catch (error) {
    console.error('获取本周学习单词数量失败:', error)
    return {
      success: false,
      message: '获取本周学习单词数量失败',
      error: error.message,
      code: 'DB_QUERY_ERROR'
    }
  }
};

// 云函数入口函数
exports.main = async (event, context) => {
  switch (event.type) {
    case "getOpenId":
      return await getOpenId();
    case "saveUserInfo":
      return await saveUserInfo(event);
    case "getUserInfo":
      return await getUserInfo();
    case "getCurWeekStudyCount":
      return await getCurWeekStudyCount();
    case "saveUserWordBook":
      return await saveUserWordBook(event);
  }
}